Sa se scrie un program de asamblare care tipareste pe ecran, in baza 10, continutul registrilor AX si BX.
Rezolvare: Deoarece nu exista nici o intrerupere, a carei rutina de tratare sa poata tipari (sau citi) un numar in baza 10, va trebui sa ne folosim de functia 02h a intreruperii 21h care stie sa afiseze un caracter sau de functia 09h a intreruperii 21h care afiseaza un sir de caractere. Pentru a ajunge de la un numar (ex. 2435 in baza 10) la un sir de caractere pe care sa-l putem afisa (ex. sirul ‘2’,’4’,’3’,’5’) vom imparti succesiv numarul si caturile obtinute la 10 si vom retine resturile care reprezinta de fapt, cifrele numarului.
assume cs:code, ds:data
data segment
LinieNoua db 10,13,’$’
zece dw 10
data segment
code segment
AfisBaza10 PROC
; definim o procedura care afiseaza registrul ax in baza 10
cmp ax, 0
jge pozitiv
; altfel, numarul e negativ si afisam un ‘-‘ cu ajutorul functiei 02h a int 21h
push ax
mov ah, 02h
mov dl, ‘-‘
int 21h
pop ax
neg ax ; ax:= valoarea absoluta a lui ax
pozitiv:
; pentru a nu
avea depasiri, vom imparti totdeauna pe DX:AX la 10. Tot
; impartim la 10 si punem resturile obtinute (adica cifrele) pe stiva pentru
; a inversa, in final, ordinea lor.
mov cx, 0 ; in cx, vom retine numarul de cifre puse pe stiva
repeta:
mov dx, 0
div zece
push dx
inc cx
cmp ax, 0
ja repeta ; daca catul>0 jmp repeta
; acuma vom
scoate fiecare cifra de pe stiva si o vom afisa u ajutorul
; functiei 02h a int 21h
scoate:
pop dx
; restul, adica cifra, se afla in DL (deoarece este un numar intre 0 si ;10)
add dl, ‘0’ ; obtinem caracterul corespunzator cifrei
mov ah, 02h
int 21h
loop scoate
ret ; revenirea din procedura
AfisBaza10 ENDP
start:
mov ax, data
mov ds, ax
mov ax, 2435
; afisam valoarea din ax apeland procedura AfisBaza10
call AfisBaza10
; sarim la linie noua pe ecran
mov ah, 09h
lea dx, LinieNoua
int 21h
mov ax, bx
; afisam valoarea din ax apeland procedura AfisBaza10
call AfisBaza10
mov ax, 4c00h
int 21h
code ends
end start
\